import json

import allure
import requests
from tools.handle_path import pic_path
from loguru import logger
from tools.handle_extract import extract_resp
from tools.hande_replace import replace_mark
from tools.handle_presql import pre_sql

@allure.step("请求方法")
def requests_api(case,token=None): # token参数就是为了接收token数据的，因为有些接口不需要token 设置默认为空值
    method = case["请求方法"]
    url = case["接口地址"]
    param = case["请求参数"]
    header = case["请求头"]
    presql = case["前置SQL"]

    # url地址里也有占位符 所以也要进行替换
    url = replace_mark(url)

    presql = replace_mark(presql)
    #执行前置sql
    pre_sql(presql)
    # 在参数做反序列化之前 去完成替换操作
    header = replace_mark(header) # 调用替换函数得到返回值--替换完成后的数据再重新赋值给变量
    param = replace_mark(param)

    # 发送接口请求之前，头部和参数需要做反序列操作 转化为字典
    # 如果某些用例头部和参数为空，读取出来是None，不能进行反序列化操作；-- 判空处理
    if param is not None:
        param = json.loads(param) #字典
    if header is not None:
        header = json.loads(header)  #字典
        if token is not None:
            # 增加键值对 - authorization头部  --把token加到头部里
            header["Authorization"] = token # key存在就是替换value，可以不存在就是新增键值对

    logger.info("=================请求消息==========================")
    logger.info(f"请求方法是：{method}")
    logger.info(f"请求地址是：{url}")
    logger.info(f"请求参数是：{param}")
    logger.info(f"请求头部是：{header}")
    # 因为我们这个函数需要覆盖get post put等各种请求方法处理，所以通过不同分支判断处理：
    resp = None  #初始化resp
    if method.lower() == "get":  # excel表格里写的方法大小写可能不一样，所以统一化大小写再判断
        # 发送get请求
        resp = requests.request(method, url, headers=header, params=param)
    elif method.lower() == "post":
        # 发送post请求: 因为post请求content-type不一样，发送请求方式不一样的；分支判断
        if header["Content-Type"] == "application/json":
            resp = requests.request(method, url, headers=header, json=param)
        elif header["Content-Type"] == "application/x-www-form-urlencoded":
            resp = requests.request(method, url, headers=header, data=param)
        elif header["Content-Type"] == "multipart/form-data":
            header.pop("Content-Type")
            # 构建一个文件参数：param = {"filename":"dad.png"}
            filename = param["filename"]  # "dad.png"
            param_file = {"file": open(pic_path/filename,mode="rb")} # 图片路径+图片名字
            logger.info(f"文件参数：{param_file}")
            logger.info(f"文件上传的头部：{header}")
            resp = requests.request(method, url, headers=header, files=param_file)
    # 发送put请求 --后续遇到这种接口再实现
    elif method.lower() == "put":
        resp = requests.request(method, url, headers=header, json=param)
    # 设置返回值 返回响应结果消息对象
    logger.info("=====================响应消息========================")
    logger.info(f"响应状态码是：{resp.status_code}")
    logger.info(f"响应正文是：{resp.text}")

    # 得到响应结果之后 调用提取函数 【后置处理器】
    extract_data = case["提取响应字段"]  # 从excel读取的提取响应字段
    extract_resp(resp,extract_data)

    return resp
